package com.ruoyi.web.controller.system;

import java.util.Date;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.CookieUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysMenuService;

/**
 * 首页 业务处理
 * 
 * @author ruoyi
 */
@Controller
public class SysIndexController extends BaseController {
	@Autowired
	private ISysMenuService menuService;

	@Autowired
	private ISysConfigService configService;

	@Autowired
	private SysPasswordService passwordService;

	// 系统首页
	@GetMapping("/index")
	public String index(ModelMap mmap, HttpServletRequest req) {
		// 跳转到指定页面，优先级最高
		String t = req.getParameter("t");
		mmap.put("t", t);
		// 取身份信息
		SysUser user = getSysUser();
		// 根据用户id取出菜单
		List<SysMenu> menus = menuService.selectMenusByUser(user);
		mmap.put("menus", menus);
		mmap.put("user", user);
		mmap.put("sideTheme", configService.selectConfigByKey("sys.index.sideTheme"));
		mmap.put("skinName", configService.selectConfigByKey("sys.index.skinName"));
		Boolean footer = Convert.toBool(configService.selectConfigByKey("sys.index.footer"), true);
		Boolean tagsView = Convert.toBool(configService.selectConfigByKey("sys.index.tagsView"), true);
		mmap.put("footer", footer);
		mmap.put("tagsView", tagsView);
		mmap.put("mainClass", contentMainClass(footer, tagsView));
		mmap.put("name", RuoYiConfig.getName());
		mmap.put("copyrightYear", RuoYiConfig.getCopyrightYear());
		mmap.put("demoEnabled", RuoYiConfig.isDemoEnabled());
		mmap.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
		mmap.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate()));
		mmap.put("isMobile", ServletUtils.checkAgentIsMobile(ServletUtils.getRequest().getHeader("User-Agent")));

		// 菜单导航显示风格
		String menuStyle = configService.selectConfigByKey("sys.index.menuStyle");
		// 移动端，默认使左侧导航菜单，否则取默认配置
		String indexStyle = ServletUtils.checkAgentIsMobile(ServletUtils.getRequest().getHeader("User-Agent")) ? "index"
				: menuStyle;

		// 优先Cookie配置导航菜单
		Cookie[] cookies = ServletUtils.getRequest().getCookies();
		for (Cookie cookie : cookies) {
			if (StringUtils.isNotEmpty(cookie.getName()) && "nav-style".equalsIgnoreCase(cookie.getName())) {
				indexStyle = cookie.getValue();
				break;
			}
		}
		String webIndex = "topnav".equalsIgnoreCase(indexStyle) ? "index-topnav" : "index";
		return webIndex;
	}

	// 锁定屏幕
	@GetMapping("/lockscreen")
	public String lockscreen(ModelMap mmap) {
		mmap.put("user", getSysUser());
		ServletUtils.getSession().setAttribute(ShiroConstants.LOCK_SCREEN, true);
		return "lock";
	}

	// 解锁屏幕
	@PostMapping("/unlockscreen")
	@ResponseBody
	public AjaxResult unlockscreen(String password) {
		SysUser user = getSysUser();
		if (StringUtils.isNull(user)) {
			return AjaxResult.error("服务器超时，请重新登录");
		}
		if (passwordService.matches(user, password)) {
			ServletUtils.getSession().removeAttribute(ShiroConstants.LOCK_SCREEN);
			return AjaxResult.success();
		}
		return AjaxResult.error("密码不正确，请重新输入。");
	}

	// 切换主题
	@GetMapping("/system/switchSkin")
	public String switchSkin() {
		return "skin";
	}

	// 切换菜单
	@GetMapping("/system/menuStyle/{style}")
	public void menuStyle(@PathVariable String style, HttpServletResponse response) {
		CookieUtils.setCookie(response, "nav-style", style);
	}

	// 系统介绍
	@GetMapping("/system/main")
	public String main(ModelMap mmap) {
		mmap.put("version", RuoYiConfig.getVersion());
		return "redirect:/realtime/main";
	}

	// content-main class
	public String contentMainClass(Boolean footer, Boolean tagsView) {
		if (!footer && !tagsView) {
			return "tagsview-footer-hide";
		} else if (!footer) {
			return "footer-hide";
		} else if (!tagsView) {
			return "tagsview-hide";
		}
		return StringUtils.EMPTY;
	}

	// 检查初始密码是否提醒修改
	public boolean initPasswordIsModify(Date pwdUpdateDate) {
		Integer initPasswordModify = Convert.toInt(configService.selectConfigByKey("sys.account.initPasswordModify"));
		return initPasswordModify != null && initPasswordModify == 1 && pwdUpdateDate == null;
	}

	// 检查密码是否过期
	public boolean passwordIsExpiration(Date pwdUpdateDate) {
		Integer passwordValidateDays = Convert
				.toInt(configService.selectConfigByKey("sys.account.passwordValidateDays"));
		if (passwordValidateDays != null && passwordValidateDays > 0) {
			if (StringUtils.isNull(pwdUpdateDate)) {
				// 如果从未修改过初始密码，直接提醒过期
				return true;
			}
			Date nowDate = DateUtils.getNowDate();
			return DateUtils.differentDaysByMillisecond(nowDate, pwdUpdateDate) > passwordValidateDays;
		}
		return false;
	}
}
